
import java.io.Serializable;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Observable;

public class Periodique extends Observable implements Serializable {
	
	// ************************************************************************************************************
	// Constantes
	// ************************************************************************************************************

	private static final long serialVersionUID = 1L;

	// ************************************************************************************************************
	// Attributs
	// ************************************************************************************************************

		private String _issn;
		private String _titre;
		private int _derNumParution;
		
		// Attributs d'Association
		private HashMap<Integer, Parution> _parutions;


		// ************************************************************************************************************
		// Constructeur
		// ************************************************************************************************************

		/**
		 * Constructeur. 
		 * @param issn			numero Issn du periodique
		 * @param titre			titre du periodique
		*/
	
	public Periodique(String issn, String titre){
		this.setIssn(issn);
		this.setTitre(titre);
		this.setParutions(new HashMap<Integer, Parution>());
		this.setDerNumParution(0);
	}// Fin Constructeur
	
	
	// ************************************************************************************************************
		// Méthodes privées
		// ************************************************************************************************************
		
		// ------------------------------------------------------------------------------------------------------------
		// Affecteurs
		
		/**
		 * setter de l'attribut issn
		 * @param issn valeur à affecter àissn du periodique
		 */
	
	private void setIssn(String issn){
		_issn = issn;
	}
	
	/**
	 * setter de l'attribut titre
	 * @param titre valeur à affecter à titre du periodique
	 */
	private void setTitre(String titre){
		_titre = titre;
	}

	
	
	private void setParution(Parution par, Integer titre){
			this.getParutions().put(titre,par);
	}
	
	
	/**
	 * setter de l'attrribut parutions (ensemble des parution du periodique)
	 * @param parutions hashmap de parution
	 */
	private void setParutions(HashMap<Integer, Parution> parutions) {
		_parutions = parutions;
	}
	
	
	private void lierParution(Integer id, Parution par){
		_parutions.put(id, par);
	} //Fin lierParution
	
	
	public void notifierObservateurs() {
		this.setChanged();
		this.notifyObservers();	
	}
	
	/**
	 * retourne une parution par la string de son id
	 * @param s la chaine identifiante dans les key de la hashmap
	 * @return la parution ou null
	 */
	public Parution getParution(String s){
		Parution par = null;
		Parution parretour = null;
		for( Entry<Integer, Parution> entry : getParutions().entrySet()){
			par = entry.getValue();
			if( par.getId().compareTo(s) == 0 ){
				parretour = par;
			}
		}
		return parretour;
	}
	/*
	 * Ensemble de m�thode pour g�rer l'indexation des parutions de la HashMap de periodique**********************************************************
	 */

	private void setDerNumParution(int derNumParution) {
		_derNumParution  = derNumParution ;
	}
	
	private int getderNumParution() {
		return _derNumParution;
	}
			
	/**
	 * Génère un numéro de article.
	 * @return un entier représentant le prochain numéro disponible pour un article de la parution 
	 */
	private int genererNumeroParution() {
		this.setDerNumParution(this.getderNumParution() + 1);
		return this.getderNumParution();
	} // Fin genererNumeroExemplaire************************************************************************************************************************
	
	
	// ************************************************************************************************************
	// Méthodes publiques
	// ************************************************************************************************************

	// ------------------------------------------------------------------------------------------------------------
	// Accesseurs
	
	/**
	 * Getter de l'Issn.
	 * @return issn de l'ouvrage
	 */
	public String getIssn() {
		return _issn;
	}

	/**
	 * Getter du titre.
	 * @return titre du periodique
	 */
	public String getTitre() {
		return _titre;
	}
	
	/**
	 * getter de l'ensemble des parutions du periodique
	*/
	public HashMap<Integer, Parution> getParutions() {
		return _parutions;
	}
	
/**
	 * getter d'une parution du periodique
	 * @param id id de d'une parution retourné
	 * @return la parution dont le id a été passé en paramètre, s'il existe
	 
	public Parution getParution(String id) {
		return (Parution) _parutions.get(id);
	} // Fin unParution

*/	
	// ------------------------------------------------------------------------------------------------------------
		// Traitements

		/**
		 * Ajout d'une parution �u� periodique. 
		 * @param id identificateur de la parution.
		 * @return l'exemplaire ou null si id = null en param 
		 */
	public Parution ajouterParution(String id){
		//creation de la parution
		if(id != null) {
			// generation du numero de la parution dans le HashMap
			int numero = this.genererNumeroParution();	
		
			Parution parution = new Parution(id, this);
			//liaison du periodique a la parution
			this.lierParution(numero, parution);
			// notifie ses observateurs du changement
			this.notifierObservateurs();
			return parution;
		}
		else {
			return null;
		}
	}
	
	
}
